package es.ucm.fdi.pe.practica2.genetico2.cruce;

import java.util.LinkedList;

import es.ucm.fdi.pe.practica2.genetico2.Alumno;
import es.ucm.fdi.pe.practica2.genetico2.CromosomaAlumnos;

public class CruceOrdinal {

	LinkedList<Alumno> listaValores;
	LinkedList<Integer> r1;
	LinkedList<Integer> r2;

	public void cruce(CromosomaAlumnos c1, CromosomaAlumnos c2) {
		listaValores = new LinkedList<Alumno>();
		r1 = new LinkedList<Integer>();
		r2 = new LinkedList<Integer>();
		
		for (Alumno a : c1.getGruposAlumnos())
			if (!listaValores.contains(a))
				listaValores.add(a);
		for (Alumno a : c2.getGruposAlumnos())
			if (!listaValores.contains(a))
				listaValores.add(a);

		for (int i=listaValores.size()-1; i>=1; i--) {
			int j = (int)(Math.random()*((double)i));
			Alumno aux = listaValores.get(j);
			listaValores.set(j,listaValores.get(i));
			listaValores.set(i,aux);
		}
		
		LinkedList<Alumno> cLista = new LinkedList<Alumno>();
		cLista.addAll(listaValores);
		
		
		for(Alumno a: c1.getGruposAlumnos())	{
			r1.add(cLista.indexOf(a));
			cLista.remove(a);
		}
		
		cLista.clear();
		cLista.addAll(listaValores);
		
		
		for (Alumno a : c2.getGruposAlumnos()) {
			r2.add(cLista.indexOf(a));
			cLista.remove(a);
		}
		
		
		int punto = (int) (Math.random() * (c1.getN()));

		while (punto == 0 || punto >= c1.getN()) {
			punto = (int) (Math.random() * (c1.getN()));
		}

		LinkedList<Integer> copia = new LinkedList<Integer>();
		copia.addAll(r1);
		for (int i = punto; i < r1.size(); i++) {
			r1.set(i, r2.get(i));
			r2.set(i, copia.get(i));

		}
		
		cLista.clear();
	
		cLista.addAll(listaValores);
		
	
		for (int index = 0; index < c1.getN(); index++) {	
			c1.getGruposAlumnos().set(index,cLista.get(r1.getFirst()));
			cLista.remove((int)r1.getFirst());
			r1.removeFirst();
		}
		
		
		cLista.clear();
		cLista.addAll(listaValores);
		
		for (int index = 0; index < c2.getN(); index++) {
			c2.getGruposAlumnos().set(index,cLista.get(r2.getFirst()));
			cLista.remove((int)r2.getFirst());
			r2.removeFirst();
		}	
	}

}
